; To create executable:
; Using djgpp:
; nasm -f coff first.asm
; gcc -o first first.o driver.c asm_io.o




;otra inicializacion
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;DGROUP         GROUP    _DATA, _BSS


;_DATA          SEGMENT WORD PUBLIC 'DATA'
;_DATA          ENDS


;_BSS           SEGMENT   WORD PUBLIC 'BSS'
;_BSS           ENDS


;_TEXT          SEGMENT BYTE PUBLIC 'CODE'
;               ASSUME CS:_TEXT,DS:DGROUP,SS:DGROUP
; codigo
;_TEXT          ENDS
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

; 
;         ; Segmento de datos
;         segment .data
;         ;datos inicializados
; 
;         segment .bss
;         ;datos no inicializados
; 
; 
;         ; Segmento de codigo
;         segment .text
; 
;         public _initRS
;         public _statusRs
;         public _sendRs
;         public _recvRS
;***********************************************************************************************
;
;Funcion: _initRS (int COM#)
;Descripcion: esta Funcion inicializa la comunicacion serie de acuerdo al numero del puerto COM
;Parametros: [Bp+2] = COM# (en modo Tiny, Small o Compact)
;            [Bp+4] = COM# (en modo Huge, Big o Medium)
;
;***********************************************************************************************
; proc    _initRS
;         push   bp               ; Preservo Bp
;         mov    bp, sp
; 
;         mov ax, [bp+X]          ; obtengo el parametro
;         MOV dx, ax		; define COM#
;        	MOV ah, 00h 		; carga la funcion 00, en reg ah.
; 	MOV al, e3h		; carga 111 00 0 11b en al (parametro)
; 	                        ; baud rate (7-5): 111 -> 9600
; 	                        ; parity (4-3): 00 -> none
; 	                        ; stop (2): 0 -> 1
; 	                        ; word lenght (1-0): 11 -> 8 bits.
; 	INT 14h			; invoca interrupcion 14, por software.
; 
;         pop bp                  ; restauro bp
;         ret
; endp    _initRS


;***********************************************************************************************
;
;Funcion: _statusRS (int COM#)
;Descripcion: esta Funcion obtiene el estado de la comunicacion serie de acuerdo al numero del puerto COM
;Parametros: [Bp+2] = COM# (en modo Tiny, Small o Compact)
;            [Bp+4] = COM# (en modo Huge, Big o Medium)
;Return: AX = port status code (see AH = 00h above)
;
;***********************************************************************************************
; proc    _statusRS
;         push   bp               ; Preservo Bp
;         mov    bp, sp
; 
;         xor    ax, ax
;         mov ax, [bp+X]          ; obtengo el parametro
;         MOV dx, ax		; define COM#
;        	MOV ah, 03h 		; carga la funcion 00, en reg ah.
; 	INT 14h			; invoca interrupcion 14, por software.
; 
;         pop bp                  ; restauro bp
;         ret
; endp    _statusRS

;***********************************************************************************************
;
;Funcion: _sendRS (int COM#, int char)
;Descripcion: esta Funcion envia un caracter en la comunicacion serie de acuerdo al numero del puerto COM
;Parametros: [Bp+2] = COM# (en modo Tiny, Small o Compact)
;            [Bp+4] = COM# (en modo Huge, Big o Medium)
;
;***********************************************************************************************
; proc    _sendRS
;         push   bp               ; Preservo Bp
;         mov    bp, sp
; 
;         xor    ax, ax
;         mov ax, [bp+2X]          ; obtengo el parametro
;         MOV dx, ax		; define COM#
;         mov al, [bp+X]          ; obtengo el caracter a enviar
;        	MOV ah, 01h 		; carga la funcion 00, en reg ah.
; 	INT 14h			; invoca interrupcion 14, por software.
; 
;         pop bp                  ; restauro bp
;         ret
; endp    _sendRS

;***********************************************************************************************
;
;Funcion: _recvRS (int COM#)
;Descripcion: esta Funcion recibe un caracter de la comunicacion serie de acuerdo al numero del puerto COM
;Parametros: [Bp+2] = COM# (en modo Tiny, Small o Compact)
;            [Bp+4] = COM# (en modo Huge, Big o Medium)
;Return: AL = character received
;        AH = RS-232 status code
;
;***********************************************************************************************
; proc    _recvRS
;         push   bp               ; Preservo Bp
;         mov    bp, sp
; 
;         xor    ax, ax
;         mov ax, [bp+X]          ; obtengo el parametro
;         MOV dx, ax		; define COM#
;        	MOV ah, 02h 		; carga la funcion 00, en reg ah.
; 	INT 14h			; invoca interrupcion 14, por software.
; 
;         pop bp                  ; restauro bp
;         ret
; endp    _recvRS
; 
;         end
;////////////////////////////////////////////////////////////////////////////////////////////////
        ; Segmento de datos
        segment .data
        ;datos inicializados

        segment .bss
        ;datos no inicializados


        ; Segmento de codigo
        segment .text

        global _initRS
        global _statusRS
        global _sendRS
        global _recvRS
        global _print_s
;***********************************************************************************************
;
;Funcion: _initRS (int COM#)
;Descripcion: esta Funcion inicializa la comunicacion serie de acuerdo al numero del puerto COM
;Parametros: [Bp+2] = COM# (en modo Tiny, Small o Compact)
;            [Bp+4] = COM# (en modo Huge, Big o Medium)
;
;***********************************************************************************************
_initRS:
        enter   4,0
       ; push   ebp              ; Preservo Bp
       ; mov    ebp, esp

        xor     eax, eax
        xor     edx, edx
        mov     eax, [ebp+8]    ; obtengo el parametro
        dec     eax             ; Parametro-1 = COM (0-> COM1)
        MOV     dx, ax		; define COM#
       	MOV     ah, 00h 	; carga la funcion 00, en reg ah.
	MOV     al, 0e3h	; carga 111 00 0 11b en al (parametro)
	                        ; baud rate (7-5): 111 -> 9600
	                        ; parity (4-3): 00 -> none
	                        ; stop (2): 0 -> 1
	                        ; word lenght (1-0): 11 -> 8 bits.
	;INT 14h			; invoca interrupcion 14, por software.

        ;pop ebp                  ; restauro bp
        leave
        ret


;***********************************************************************************************
;
;Funcion: _statusRS (int COM#)
;Descripcion: esta Funcion obtiene el estado de la comunicacion serie de acuerdo al numero del puerto COM
;Parametros: [Bp+2] = COM# (en modo Tiny, Small o Compact)
;            [Bp+4] = COM# (en modo Huge, Big o Medium)
;Return: AX = port status code (see AH = 00h above)
;
;***********************************************************************************************
_statusRS:
        enter   4,0
       ; push   ebp              ; Preservo Bp
       ; mov    ebp, esp

        xor     eax, eax
        xor     edx, edx
        mov     eax, [ebp+8]    ; obtengo el parametro
        dec     eax             ; Parametro-1 = COM (0-> COM1)
       	MOV     ah, 03h 	; carga la funcion 00, en reg ah.
	INT     14h		; invoca interrupcion 14, por software.

        ;pop ebp                  ; restauro bp
        leave
        ret


;***********************************************************************************************
;
;Funcion: _sendRS (int COM#, int char)
;Descripcion: esta Funcion envia un caracter en la comunicacion serie de acuerdo al numero del puerto COM
;Parametros: [Bp+2] = COM# (en modo Tiny, Small o Compact)
;            [Bp+4] = COM# (en modo Huge, Big o Medium)
;
;***********************************************************************************************
        
_sendRS:
        enter   4,0
       ; push   ebp              ; Preservo Bp
       ; mov    ebp, esp

        xor     eax, eax
        xor     edx, edx
        mov     eax, [ebp+12]   ; obtengo el parametro
        dec     eax             ; Parametro-1 = COM (0-> COM1)
        mov     al, [bp+8]      ; obtengo el caracter a enviar
       	MOV     ah, 01h 	; carga la funcion 00, en reg ah.
	INT     14h		; invoca interrupcion 14, por software.

        ;pop ebp                  ; restauro bp
        leave
        ret

;***********************************************************************************************
;
;Funcion: _recvRS (int COM#)
;Descripcion: esta Funcion recibe un caracter de la comunicacion serie de acuerdo al numero del puerto COM
;Parametros: [Bp+2] = COM# (en modo Tiny, Small o Compact)
;            [Bp+4] = COM# (en modo Huge, Big o Medium)
;Return: AL = character received
;        AH = RS-232 status code
;
;***********************************************************************************************
_recvRS:
        enter   4,0
       ; push   ebp              ; Preservo Bp
       ; mov    ebp, esp

        xor     eax, eax
        xor     edx, edx
        mov     eax, [ebp+8]    ; obtengo el parametro
        dec     eax             ; Parametro-1 = COM (0-> COM1)
       	MOV     ah, 02h 	; carga la funcion 00, en reg ah.
	INT     14h		; invoca interrupcion 14, por software.

        ;pop ebp                  ; restauro bp
        leave
        ret
;***********************************************************************************************
;
;Funcion: _recvRS (int COM#)
;Descripcion: esta Funcion recibe un caracter de la comunicacion serie de acuerdo al numero del puerto COM
;Parametros: [Bp+2] = COM# (en modo Tiny, Small o Compact)
;            [Bp+4] = COM# (en modo Huge, Big o Medium)
;Return: AL = character received
;        AH = RS-232 status code
;
;***********************************************************************************************
_print_s:
        enter   4,0
       ; push   ebp              ; Preservo Bp
       ; mov    ebp, esp

        xor     eax, eax
        mov     eax, [ebp+8]      ; obtengo el parametro
        inc     eax
        add     eax, 1
        ;pop    ebp                  ; restauro bp
        leave
        ret
